MVVM প্যাটার্নে Async Validation এবং Error Notification ব্যবহৃত হয় যখন অ্যাপ্লিকেশনের ভিউমডেল সঠিকভাবে ডেটা যাচাই করার পাশাপাশি ব্যবহারকারীকে ভুল তথ্য প্রদর্শন করতে চায়। Async Validation মূলত দীর্ঘস্থায়ী প্রক্রিয়া যেমন ডেটাবেস যাচাই, API কল, বা সার্ভার সাইড ভ্যালিডেশন হ্যান্ডেল করতে ব্যবহৃত হয়। এক্ষেত্রে, Error Notification ব্যবহারকারীকে সঠিকভাবে ফিডব্যাক দেয় যাতে তারা সমস্যা দ্রুত জানতে পারে এবং সংশোধন করতে পারে।
Async Validation হল সেই প্রক্রিয়া যেখানে ডেটা যাচাইয়ের কাজ একটি অ্যাসিঙ্ক্রোনাস (Asynchronous) পদ্ধতিতে করা হয়, যাতে ইউজার ইন্টারফেস (UI) স্ন্যাগ বা ফ্রিজ না হয়ে, স্বচ্ছন্দে কাজ চালিয়ে যেতে পারে। এক্ষেত্রে ViewModel-এ ICommand বা Task ব্যবহার করে ভ্যালিডেশন পরিচালিত হয়।
ধরা যাক, আমরা একটি Email ফিল্ড ভ্যালিডেট করতে চাই, যা একটি সার্ভার সাইড চেক (যেমন ইমেইল রেজিস্ট্রেশন চেক) সম্পাদন করবে।
public class RegistrationViewModel : INotifyPropertyChanged
{
private string _email;
private string _emailError;
private bool _isEmailValid;
public string Email
{
get => _email;
set
{
if (_email != value)
{
_email = value;
OnPropertyChanged();
ValidateEmailAsync();
}
}
}
public string EmailError
{
get => _emailError;
private set
{
if (_emailError != value)
{
_emailError = value;
OnPropertyChanged();
}
}
}
public bool IsEmailValid
{
get => _isEmailValid;
private set
{
if (_isEmailValid != value)
{
_isEmailValid = value;
OnPropertyChanged();
}
}
}
private async Task ValidateEmailAsync()
{
EmailError = string.Empty;
IsEmailValid = false;
if (string.IsNullOrEmpty(Email))
{
EmailError = "Email cannot be empty.";
return;
}
var isValid = await CheckEmailInDatabaseAsync(Email);
if (isValid)
{
IsEmailValid = true;
}
else
{
EmailError = "Email is already registered.";
}
}
private async Task<bool> CheckEmailInDatabaseAsync(string email)
{
// Fake async DB check (in real case, call API or database)
await Task.Delay(2000); // Simulating async task
return email != "existing@example.com"; // Fake check
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
এখানে, Email প্রপার্টি যখন পরিবর্তিত হবে, তখন ValidateEmailAsync কল করা হবে, যা ইমেইলটি সার্ভারের সাথে যাচাই করবে এবং ব্যবহারকারীর কাছে উপযুক্ত ভুল বার্তা (Error Message) দেখাবে।
<!-- XAML File (View) -->
<TextBox Text="{Binding Email}" />
<TextBlock Text="{Binding EmailError}" Foreground="Red" />
<Button Content="Register" Command="{Binding RegisterCommand}" IsEnabled="{Binding IsEmailValid}" />
এখানে, EmailError ত্রুটি বার্তাটি TextBlock এ দেখানো হচ্ছে, যা ValidateEmailAsync থেকে প্রাপ্ত হবে।
Error Notification টেকনিকটি ব্যবহৃত হয় যখন অ্যাপ্লিকেশনটিতে কোনো ত্রুটি ঘটলে তা ব্যবহারকারীকে দেখানোর প্রয়োজন হয়। এই ত্রুটির বার্তা সাধারণত ViewModel থেকে View-এ পাঠানো হয়। এ জন্য আপনি INotifyDataErrorInfo বা ValidationAttribute ব্যবহার করতে পারেন।
INotifyDataErrorInfo ইন্টারফেসের মাধ্যমে ViewModel-এ ডেটা ভ্যালিডেশন এবং এরর ম্যাসেজ গুলি View-এ সরবরাহ করা যায়। এই ইন্টারফেসের মাধ্যমে অ্যাসিঙ্ক্রোনাস বা সিনক্রোনাস ভ্যালিডেশন করতে পারবেন।
public class RegistrationViewModel : INotifyDataErrorInfo
{
private readonly Dictionary<string, List<string>> _errors = new Dictionary<string, List<string>>();
public bool HasErrors => _errors.Any();
public IEnumerable GetErrors(string propertyName)
{
if (_errors.ContainsKey(propertyName))
{
return _errors[propertyName];
}
return null;
}
private string _email;
public string Email
{
get => _email;
set
{
if (_email != value)
{
_email = value;
ValidateEmail();
}
}
}
private void ValidateEmail()
{
ClearErrors(nameof(Email));
if (string.IsNullOrEmpty(Email))
{
AddError(nameof(Email), "Email cannot be empty.");
}
// Simulate async email check
if (Email == "existing@example.com")
{
AddError(nameof(Email), "Email is already registered.");
}
}
private void AddError(string propertyName, string error)
{
if (!_errors.ContainsKey(propertyName))
{
_errors[propertyName] = new List<string>();
}
_errors[propertyName].Add(error);
OnErrorsChanged(propertyName);
}
private void ClearErrors(string propertyName)
{
if (_errors.ContainsKey(propertyName))
{
_errors[propertyName].Clear();
OnErrorsChanged(propertyName);
}
}
public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;
protected virtual void OnErrorsChanged(string propertyName)
{
ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
}
}
এখানে, INotifyDataErrorInfo ইন্টারফেসটি Email প্রপার্টির জন্য ত্রুটি বার্তা প্রদান করে, এবং সেই ত্রুটির বার্তা View তে দেখানো হয়।
<!-- XAML File (View) -->
<TextBox Text="{Binding Email}" />
<TextBlock Text="{Binding Errors[Email]" Foreground="Red" />
<Button Content="Register" Command="{Binding RegisterCommand}" IsEnabled="{Binding IsEmailValid}" />
এখানে, TextBlock এর মাধ্যমে Email প্রপার্টির ত্রুটি বার্তা দেখানো হচ্ছে।
এভাবে Async Validation এবং Error Notification MVVM প্যাটার্নে ব্যবহারকারী ইন্টারঅ্যাকশন এবং অ্যাপ্লিকেশনের কার্যকারিতা উন্নত করতে সাহায্য করে।
common.read_more